package br.com.advocacia.util;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;

import org.apache.commons.lang.StringEscapeUtils;

public class JSFMensagem {
	
	private static final String PACKAGE_RESOURCES = "internacionalizacao";

    /**
     * @return O {@link ResourceBundle} padrão da aplicação.
     */
    private static ResourceBundle getResourceBundle() {
		return getResourceBundle(PACKAGE_RESOURCES);
    }

    /**
     * @param nome Nome do ResourceBundle.
     * @return O {@link ResourceBundle} com o nome passado como parâmetro.
     */
    private static ResourceBundle getResourceBundle(String nome) {
        Locale idioma = FacesContext.getCurrentInstance().getViewRoot().getLocale();
        
        ResourceBundle resource = null;
        
        if (idioma != null) {
			if (idioma.getLanguage().equalsIgnoreCase("pt")) {
				resource = ResourceBundle.getBundle(PACKAGE_RESOURCES+".mensagens");
			} else if (idioma.getLanguage().equalsIgnoreCase("en")) {
				resource = ResourceBundle.getBundle(PACKAGE_RESOURCES+".mensagens_en");
			} else if (idioma.getLanguage().equalsIgnoreCase("es")) {
				resource = ResourceBundle.getBundle(PACKAGE_RESOURCES+"mensagens_it");
			}
		}
        
        return resource;
    }

    /**
     * Retorna a mensagem do resource bundle associado a chave.
     * @param codigoMensagem
     * @return A mensagem do resource bundle.
     */
    public static String getMensagemAplicacao(String codigoMensagem) {
    	String texto = "";
    	try {
    		 texto = getResourceBundle().getString(codigoMensagem); 
    	} catch (Exception e) {
    		texto = "???" + codigoMensagem + "???";
    	}
   	
        return texto;
    }
    
    public static String parametro(String codigoMensagem) {
    	return getResourceBundle().getString(codigoMensagem);
    }
    
    /**
     * Retorna a mensagem do resource bundle associado a chave setando seus parâmetros.
     * @param codigoMensagem
     * @param paramentrosMensagem
     * @return
     */
    public static String mensagem(String codigoMensagem, Object... paramentrosMensagem) {
       
        String mensagem = getMensagemAplicacao(codigoMensagem);
        
        return formatarMensagem(mensagem, paramentrosMensagem);
    }

    public static String getFormatarMensagemSucesso(String codigoMensagem, Object... paramentrosMensagem) {
    	
    	String mensagem = getMensagemAplicacao(codigoMensagem);
    	
    	return formatarMensagem(mensagem, paramentrosMensagem);
    }
    
    /**
     * Formata uma mensagem subistituindo seus parâmetros.
     *
     * @param mensagem A mensagem.
     * @param parametrosMensagem Os parâmetros da mensagem.
     */
    public static String formatarMensagem(String mensagem, Object... parametrosMensagem) {

        if (parametrosMensagem != null) {
            Application application = FacesContext.getCurrentInstance().getApplication();
            MessageFormat messageFormat = new MessageFormat(mensagem, application.getDefaultLocale());
            mensagem = messageFormat.format(parametrosMensagem);
        }

        return mensagem;
    }

    /**
     * Cria uma mensagem e coloca no {@link FacesContext}.
     *
     * @param severity Severidade da mensagem. {@link Severity}
     * @param mensagem Texto da mensagem ser criada.
     * @param parametrosMensagem Parametros para montar a mensagem.
     */
    private static void addMensagem(Severity severity, String codigoMensagem, Object... parametrosMensagem) {
       
        String mensagem = mensagem(codigoMensagem, parametrosMensagem);
       
        FacesMessage facesMessage = new FacesMessage(severity, StringEscapeUtils.escapeJavaScript(mensagem), null);

        FacesContext.getCurrentInstance().addMessage(null, facesMessage);
    }
    
   
    /**
     * Pega a Mensagem de uma Exception e coloca no {@link FacesContext}.
     *
     * @param severity Severidade da mensagem. {@link Severity}
     * @param mensagem Descrição da exception.
     */
    public static void addExceptionMessage(Exception exception) {
       
        String mensagem = exception.getMessage();
       
        if(mensagem == null)
        {
        	mensagem = "null";
        }
        
        FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagem, null);

        FacesContext.getCurrentInstance().addMessage(null, facesMessage);
    }    

    /**
     * Cria uma mensagem de erro e coloca no {@link FacesContext}.
     *
     * @param codigoMensagem Texto da mensagem ser criada.
     * @param parametrosMensagem Parametros para montar a mensagem.
     */
    public static void addMensagemErro(String codigoMensagem, Object... parametrosMensagem) {
        addMensagem(FacesMessage.SEVERITY_ERROR, codigoMensagem, parametrosMensagem);
    }
   
    

}